#include <REGX52.H>
#include "DS18B20.h"
#include "LCD1602.h"
#include <intrins.h>

void DS18B20_Init()//发送起始信号
{
	unsigned char i;
	DS18B20_IO=1;
	DS18B20_IO=0;//主机输出低电平
	//延时480微秒
	_nop_();
	i = 218;
	while (--i);
	//
	DS18B20_IO=1;//主机释放总线，输出高电平
	//延时30微秒
	i = 11;
	while (--i);	
}

unsigned char DS18B20_receiveaction()//接受应答
{
	unsigned char i;
	unsigned char temp=0;
	//延时80微秒

	i = 34;
	while (--i);
	//接收高低电平应答信号
	temp=DS18B20_IO;
	//延时400微秒
	_nop_();
	i = 181;
	while (--i);
	return temp;
}

void DS18B20_Send_Bit(unsigned char io)//发送一个比特位
{
	unsigned char i;
	DS18B20_IO=1;
	DS18B20_IO=0;//主机拉低总线
	_nop_();//延时2微秒
	DS18B20_IO=io;
	//延时60微秒
	i = 25;
	while (--i);
	DS18B20_IO=1;//主机释放总线
	_nop_();//延时2微秒

}

unsigned char DS18B20_Read_Bit()//读取一个比特位
{
	unsigned char i=0;
	unsigned char temp=0;
	DS18B20_IO=1;
	DS18B20_IO=0;//主机拉低总线
	_nop_();//延时2微秒
	_nop_();//延时2微秒
	DS18B20_IO=1;//释放总线
	//延时6微秒
	_nop_();
	_nop_();
	_nop_();
	//采样
	temp=DS18B20_IO;
	//延时60微秒
	i = 25;
	while (--i);
	return temp;
}

void DS18B20_Send_Byte(unsigned char m_data)//发送一个字节
{
	unsigned char i=0;
	unsigned char io=0;
	
	for(i=0; i<8; i++)
	{
		io=m_data&(0x01<<i);//从低位向高位发
		DS18B20_Send_Bit(io);//发送一个比特位
	}
}

unsigned char DS18B20_Receive_Byte()//接收一个字节
{
	unsigned char temp=0;
	unsigned char i=0;
	unsigned char ret=0;

	for(i=0; i<8; i++)
	{
		ret=DS18B20_Read_Bit();
		temp|=(ret<<i);//接收一个比特位
	}
	return temp;
}

void DS18B20_Convert()
{
	DS18B20_Init();//发送起始信号
	DS18B20_receiveaction();
	DS18B20_Send_Byte(0xCC);//跳过ROM
	DS18B20_Send_Byte(0x44);//发送温度变化
}

float DS18B20_ReadTempture()
{
	float temp=0;
	int sh=0; 
	unsigned char LSB=0;//温度低位
	unsigned char MSB=0;//温度高位
	DS18B20_Init();//发送起始信号
	DS18B20_receiveaction();
	DS18B20_Send_Byte(0xCC);//发送一个字节
	DS18B20_Send_Byte(0xBE);//发送读暂存器命令
	LSB=DS18B20_Receive_Byte();
	MSB=DS18B20_Receive_Byte();
	
	sh=(MSB<<8)|LSB;//使得两组八个比特位组合在一起，产生一个int（在51中占2个字节）类型的数据
//	LCD_ShowBinNum(2,9,LSB,8);
//	LCD_ShowBinNum(2,1,MSB,8);

	temp=(sh/16.0);//因为sh二进制数表示为小数，而sh为int类型，相当于扩大了16倍
	
	return temp;
}

